﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Windows.Forms;
using System.Collections;
namespace Cartography.Desktop
{
    public class classEdificiosSantiago : System.Windows.Forms.PictureBox
    {
        private Poligono poligono;
        private Boolean Emergencia;
        private String Nombre, Direccion, Comuna, Altura, Pisos, Habitantes;
        private LatLon RedSeca, RedInerte, ViaEvacuacion;
        private string pathData;
        private int zoom;
        public classEdificiosSantiago(string pathData, int actualZoom)
        {
            this.poligono = new Poligono();
            this.MouseDown+= new MouseEventHandler(this.clickHandler);
            this.MouseMove += new MouseEventHandler(this.mouseMove);
            Nombre=Direccion=Comuna=Altura=Pisos=Habitantes="";
            this.RedInerte = new LatLon();
            this.RedSeca = new LatLon();
            this.ViaEvacuacion = new LatLon();
            zoom = actualZoom;
            this.pathData = pathData;
            
            //***********Menu contextual************
            System.Windows.Forms.ContextMenu Menu = new System.Windows.Forms.ContextMenu();
            System.Windows.Forms.MenuItem item1 = new MenuItem();
            item1.Text = "&Area de riesgo";
            Menu.MenuItems.Add(item1);
            item1.Click += new System.EventHandler(this.item1_Click);
            this.ContextMenu = Menu;
        }
        public classEdificiosSantiago(XmlNode edificio, string pathData) 
        {
            this.MouseDown += new MouseEventHandler(this.clickHandler);
            this.MouseMove += new MouseEventHandler(this.mouseMove);
            this.Nombre = edificio.SelectSingleNode("Nombre").InnerText;
            this.Direccion = edificio.SelectSingleNode("Direccion").InnerText;
            this.Comuna = edificio.SelectSingleNode("Comuna").InnerText;
            this.Altura = edificio.SelectSingleNode("Altura").InnerText;
            this.Pisos = edificio.SelectSingleNode("Pisos").InnerText;
            this.Habitantes = edificio.SelectSingleNode("Habitantes").InnerText;
            this.ViaEvacuacion = new LatLon(edificio.SelectSingleNode("ViaEvacuacion/Latitud").InnerText, edificio.SelectSingleNode("ViaEvacuacion/Longitud").InnerText);
            this.RedSeca = new LatLon(edificio.SelectSingleNode("RedSeca/Latitud").InnerText, edificio.SelectSingleNode("RedSeca/Longitud").InnerText); ;
            this.RedInerte = new LatLon(edificio.SelectSingleNode("RedInerte/Latitud").InnerText, edificio.SelectSingleNode("RedInerte/Longitud").InnerText); ;
            this.zoom = 8 ;
            this.pathData = pathData;

            XmlNode nodoVertices = edificio.SelectSingleNode("Vertices");
            int cantidadVertices = nodoVertices.ChildNodes.Count;
            LatLon[] vertices = new LatLon[cantidadVertices];
            int i=0;
            IEnumerator ienum = nodoVertices.GetEnumerator();
            XmlNode nodo;
            System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
            while (ienum.MoveNext())
            {
                nodo = (XmlNode)ienum.Current;
                vertices[i] = new LatLon();
                vertices[i].Latitude = double.Parse(nodo.SelectSingleNode("Latitud").InnerText, nfi);
                vertices[i].Longitude = double.Parse(nodo.SelectSingleNode("Longitud").InnerText, nfi);
                i++;
            }
            this.poligono = new Poligono(vertices);

            //***********Menu contextual************
            System.Windows.Forms.ContextMenu Menu = new System.Windows.Forms.ContextMenu();
            System.Windows.Forms.MenuItem item1 = new MenuItem();
            item1.Text = "&Area de riesgo";
            Menu.MenuItems.Add(item1);
            item1.Click += new System.EventHandler(this.item1_Click);
            this.ContextMenu = Menu;
        }
        public classEdificiosSantiago(string nombre, string direccion, string comuna, string altura, string pisos,
            string habitantes, LatLon[] coordenadas, int actualZoom, LatLon redSeca, LatLon redInerte, LatLon viaEvacuacion, string pathData)
        {

            this.poligono = new Poligono(coordenadas);
            this.MouseDown += new MouseEventHandler(this.clickHandler);
            this.MouseMove += new MouseEventHandler(this.mouseMove);
            this.Nombre = nombre;
            this.Direccion = direccion;
            this.Comuna = comuna;
            this.Altura = altura;
            this.Pisos = pisos;
            this.Habitantes = habitantes;
            this.ViaEvacuacion = viaEvacuacion;
            this.RedSeca = redSeca;
            this.RedInerte = redInerte;
            this.zoom = actualZoom;
            this.pathData = pathData;
            //***********Menu contextual************
            System.Windows.Forms.ContextMenu Menu = new System.Windows.Forms.ContextMenu();
            System.Windows.Forms.MenuItem item1 = new MenuItem();
            item1.Text = "&Area de riesgo";
            Menu.MenuItems.Add(item1);
            item1.Click += new System.EventHandler(this.item1_Click);
            this.ContextMenu = Menu;
        }
        private void mouseMove(object sender, MouseEventArgs e)
        {

            //MessageBox.Show("up");
            if (FormPrincipal.Instance.DibujarDistancia2)
            {
                FormPrincipal.Instance.Mapa.Desplazamiento = this.poligono.Location;
                FormPrincipal.Instance.Mapa.P2= new System.Drawing.Point(e.X, e.Y);
                FormPrincipal.Instance.Mapa.PTO2 = FormPrincipal.Instance.Mapa.click2LatLon(e.X + this.poligono.Location.X, e.Y + this.poligono.Location.Y);
                FormPrincipal.Instance.Mapa.refresh();
            }
        }
        public void dibujarAreaDeRiesgo() 
        {
            if (FormPrincipal.Instance.DibujarAreaDeRiesgo)
            {
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                double[] centroide = this.poligono.calcularCentroidePromedio();
                LatLon destino = FormPrincipal.Instance.Mapa.calcularDestino(centroide, 315, double.Parse(this.Altura, nfi));
               
                System.Drawing.Graphics canvas = System.Drawing.Graphics.FromImage(FormPrincipal.Instance.Mapa.Image);
                int[] punto = FormPrincipal.Instance.Mapa.toZoomedPixelCoords(destino, FormPrincipal.Instance.Mapa.getActualZoom);
                int positionScreenX1 = FormPrincipal.Instance.Mapa.getWidth / 2 + (punto[0] - FormPrincipal.Instance.Mapa.CentralTilePixel[0]);
                int positionScreenY1 = FormPrincipal.Instance.Mapa.getHeight / 2 + (punto[1] - FormPrincipal.Instance.Mapa.CentralTilePixel[1]);

                //canvas.DrawImage(b, positionScreenX1, positionScreenY1);

                punto = FormPrincipal.Instance.Mapa.toZoomedPixelCoords(new LatLon(centroide[1], centroide[0]), FormPrincipal.Instance.Mapa.getActualZoom);
                int positionScreenX2 = FormPrincipal.Instance.Mapa.getWidth / 2 + (punto[0] - FormPrincipal.Instance.Mapa.CentralTilePixel[0]);
                int positionScreenY2 = FormPrincipal.Instance.Mapa.getHeight / 2 + (punto[1] - FormPrincipal.Instance.Mapa.CentralTilePixel[1]);
                canvas.DrawEllipse(new System.Drawing.Pen(System.Drawing.Color.Red), positionScreenX1, positionScreenY1,
                    (positionScreenX2 - positionScreenX1) * 2, (positionScreenY2 - positionScreenY1) * 2);
            }
            
        }
        //funcion q maneja el evento de clic sobre el menu contextual del edificio
        private void item1_Click(object sender, System.EventArgs e) 
        {
            if (Emergencia)
            {
                FormPrincipal.Instance.DibujarAreaDeRiesgo = !FormPrincipal.Instance.DibujarAreaDeRiesgo;
                this.dibujarAreaDeRiesgo();
                FormPrincipal.Instance.Mapa.refresh();
            }
        }
        //funcion q maneja el evento del clic sobre el poligono.
        //aqui me fijo si es el boton derecho o el izquierdo del mouse.
        private void clickHandler(object sender, MouseEventArgs e)
        {
            if(e.Button!= MouseButtons.Right)
                if (!FormPrincipal.Instance.LinkearEmergencia)
                {
                    if (FormPrincipal.Instance.DibujarDistancia)
                    {
                        if (!FormPrincipal.Instance.DibujarDistancia2)
                        {
                            FormPrincipal.Instance.Mapa.P1 = new System.Drawing.Point(e.X, e.Y);
                            FormPrincipal.Instance.Mapa.DesplazamientoI = this.poligono.Location;
                            FormPrincipal.Instance.Mapa.PTO1 = FormPrincipal.Instance.Mapa.click2LatLon(e.X + this.poligono.Location.X, e.Y + this.poligono.Location.Y);
                            FormPrincipal.Instance.DibujarDistancia2 = true;

                        }
                        else
                        {
                            FormPrincipal.Instance.Mapa.P2 = new System.Drawing.Point(e.X, e.Y);
                            FormPrincipal.Instance.Mapa.Desplazamiento = this.poligono.Location;
                            FormPrincipal.Instance.Mapa.PTO2 = FormPrincipal.Instance.Mapa.click2LatLon(e.X + this.poligono.Location.X, e.Y + this.poligono.Location.Y);
                            FormPrincipal.Instance.DibujarDistancia2 = false;
                            FormPrincipal.Instance.Mapa.refresh();
                        }
                    }
                    else
                    {

                        //-----------------
                        this.dibujarPoligono(FormPrincipal.Instance.Mapa, "Seleccion");
                        if (Emergencia)
                        {
                            this.puntosDeInteresEdificio("EdificioEmergencia", FormPrincipal.Instance.Mapa);
                        }

                        FormPrincipal.Instance.Mapa.Refresh();
                        String textoInfo = "Nombre: " + this.Nombre + Environment.NewLine +
                                            "Dirección: " + this.Direccion + Environment.NewLine +
                                            "Comuna: " + this.Comuna + Environment.NewLine +
                                            "Altura (mts.): " + this.Altura + Environment.NewLine +
                                            "Pisos: " + this.Pisos + Environment.NewLine +
                                            "Habitantes: " + this.Habitantes;
                        if (Emergencia)
                        {
                            String textoInfoEmergencia="";
                            //XmlDocument doc = new XmlDocument();
                            //doc.Load(this.pathData + "PointsOfInterest\\EdificioEmergencia.xml");
                            //textoInfoEmergencia += "Clave: " + doc.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Emergencia/Clave").InnerText + Environment.NewLine +
                            //    "Acto: " + doc.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Emergencia/Acto").InnerText + Environment.NewLine +
                            //    "Observación: " + doc.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Emergencia/Observacion").InnerText;
                            textoInfoEmergencia = infoEmergencia();
                            formInfoEmergencia formulario = new formInfoEmergencia(textoInfo, textoInfoEmergencia);
                            formulario.ShowDialog();
                            this.dibujarPoligono(FormPrincipal.Instance.Mapa, "Emergencia");
                            this.puntosDeInteresEdificio("EdificioEmergencia", FormPrincipal.Instance.Mapa);
                        }
                        else
                        {
                            System.Windows.Forms.MessageBox.Show(textoInfo);
                            this.dibujarPoligono(FormPrincipal.Instance.Mapa, "Default");
                        }

                        FormPrincipal.Instance.Mapa.Refresh();
                        //-------------------
                    }
                }
                else
                {
                    crearEmergencia();
                    FormPrincipal.Instance.LinkearEmergencia = false;
                    FormPrincipal.Instance.Mapa.actualizarGrupoEdificios();
                    if (System.IO.File.Exists(this.pathData + "\\PointsOfInterest\\Emergencia.xml"))
                        System.IO.File.Delete(this.pathData + "\\PointsOfInterest\\Emergencia.xml");
                    FormPrincipal.Instance.Mapa.actualizarPuntosDeInteres();
                    FormPrincipal.Instance.Mapa.refresh();
                    FormPrincipal.Instance.botonEdificio = false;
                    double[] centroide=this.calcularCentroide();
                    FormPrincipal.Instance.cambiarLatLonEmergencia(new LatLon(centroide[1],centroide[0]));
                }
        }
        private string infoEmergencia() 
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(this.pathData + "PointsOfInterest\\EdificioEmergencia.xml");
            string resultado = "";
            XmlNode nodoEmergencia=doc.GetElementsByTagName("Emergencia")[0];
            if (nodoEmergencia.ChildNodes.Count > 0) 
            {
                IEnumerator ienum = nodoEmergencia.GetEnumerator();
                XmlNode nodo;
                while (ienum.MoveNext()) 
                {
                    nodo = (XmlNode)ienum.Current;
                    resultado += nodo.LocalName + ": " + nodo.InnerText + Environment.NewLine;
                }
            }
            return resultado;
        }
        public void crearEmergencia() {
            XmlDocument doc = new XmlDocument();
            doc.Load(this.pathData + "\\PointsOfInterest\\Emergencia.xml");
            XmlNode infoEmergencia = doc.SelectSingleNode("PointsOfInterest/Points/Point/Emergencia");
            classManejadorXMLEdificios controlXML = new classManejadorXMLEdificios(pathData, "EdificioEmergencia");
            double[] tmpCentroide = this.poligono.calcularCentroidePromedio();
            controlXML.escribirXML(this.Nombre, this.Direccion, this.Comuna, this.Altura, this.Pisos, this.Habitantes,
                this.poligono.Coordenadas, new Cartography.Desktop.LatLon(tmpCentroide[1], tmpCentroide[0]),
                this.RedSeca, this.RedInerte, this.ViaEvacuacion, infoEmergencia);
        }
        public Boolean agregarPunto(Cartography.Desktop.LatLon coordenadas2, int[] XY2)
        {
            Boolean resultado=this.poligono.agregarPunto(coordenadas2, XY2);
            if (resultado) {
                formNuevoEdificio form = new formNuevoEdificio(this);
                form.ShowDialog();
                if (this.poligono.NumeroDePuntos != 0)
                {
                    classManejadorXMLEdificios controlXML = new classManejadorXMLEdificios(pathData, "Edificios");
                    double[] tmpCentroide = this.poligono.calcularCentroidePromedio();
                    controlXML.escribirXML(this.Nombre, this.Direccion, this.Comuna, this.Altura, this.Pisos, this.Habitantes,
                        this.poligono.Coordenadas, new Cartography.Desktop.LatLon(tmpCentroide[1], tmpCentroide[0]),
                        this.RedSeca, this.RedInerte, this.ViaEvacuacion);
                }
            }
            return resultado;
        }
        public void borrarPoligonoEnEdicion()
        {
            this.poligono.borrarPoligonoEnEdicion();
        }
        public double[] calcularCentroide()
        {
            return this.poligono.calcularCentroidePromedio();
        }
        public void dibujarPoligono(Map mapa, String estado)
        {
            if (estado == "Emergencia") Emergencia = true;
            this.poligono.dibujarPoligono(mapa, estado);
            this.Image = this.poligono.Image;
            this.Size = this.poligono.Size;
            this.Location = this.poligono.Location;
        }
        public int NumeroDePuntos
        {
            get
            {
                return this.poligono.NumeroDePuntos;
            }
        }
        public Boolean Completo
        {
            get
            {
                return this.poligono.Completo;
            }
        }
        public Cartography.Desktop.LatLon[] Coordenadas
        {
            get
            {
                return this.poligono.Coordenadas;
            }
        }
        public void puntosDeInteresEdificio(string grupo, Map mapa) 
        {
            poligono.puntosDeInteresEdificio(grupo, mapa);

        }
        //private String Nombre, Direccion, Comuna, Altura, Pisos, Habitantes;
        public string nombre 
        {
            get
            {
                return this.Nombre;
            }
            set
            {
                this.Nombre = value;
            }
        }
        public string direccion
        {
            get
            {
                return this.Direccion;
            }
            set
            {
                this.Direccion = value;
            }
        }
        public string comuna
        {
            get
            {
                return this.Comuna;
            }
            set
            {
                this.Comuna = value;
            }
        }
        public string altura
        {
            get
            {
                return this.Altura;
            }
            set
            {
                this.Altura = value;
            }
        }
        public string pisos
        {
            get
            {
                return this.Pisos;
            }
            set
            {
                this.Pisos = value;
            }
        }
        public string habitantes
        {
            get
            {
                return this.Habitantes;
            }
            set
            {
                this.Habitantes = value;
            }
        }
        public LatLon redSeca
        {
            get
            {
                return this.RedSeca;
            }
            set 
            {
                this.RedSeca = value;
            }
        }
        public LatLon redInerte
        {
            get
            {
                return this.RedInerte;
            }
            set
            {
                this.RedInerte = value;
            }
        }
        public LatLon viaEvacuacion
        {
            get
            {
                return this.ViaEvacuacion;
            }
            set
            {
                this.ViaEvacuacion = value;
            }
        }
        public int actualZoom
        {
            get { return this.zoom; }
            set { this.zoom = value; }
        }

    }
}
